package org.yelongframework.excel.data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.apache.commons.collections4.CollectionUtils;
import org.yelongframework.commons.util.ListUtil;
import org.yelongframework.lang.Nullable;

/**
 * 工作表数据集
 * 
 * @since 1.0.0
 */
public final class SheetDatas {

	/** 工作表索引 */
	private final int sheetIndex;

	/** 数据集 */
	private final List<SheetData> sheetDataList = new ArrayList<>();

	// ==================================================构造器==================================================

	/**
	 * @param sheetIndex 工作表索引
	 */
	public SheetDatas(int sheetIndex) {
		this.sheetIndex = sheetIndex;
	}

	/**
	 * @param sheetIndex 工作表索引
	 * @param sheetData  数据
	 */
	public SheetDatas(int sheetIndex, SheetData sheetData) {
		this.sheetIndex = sheetIndex;
		add(sheetData);
	}

	/**
	 * @param sheetIndex    工作表索引
	 * @param sheetDataList 数据集
	 */
	public SheetDatas(int sheetIndex, List<SheetData> sheetDataList) {
		this.sheetIndex = sheetIndex;
		add(sheetDataList);
	}

	// ==================================================添加==================================================

	/**
	 * 添加一个数据。数据的工作表索引与当前的工作表索引必须一致。
	 * 
	 * @param sheetData 数据
	 */
	public void add(SheetData sheetData) {
		if (null == sheetData) {
			return;
		}
		sheetDataList.add(sheetData);
	}

	/**
	 * 添加数据。
	 * 
	 * @param sheetDataList 数据集合
	 */
	public void add(@Nullable List<SheetData> sheetDataList) {
		if (CollectionUtils.isEmpty(sheetDataList)) {
			return;
		}
		sheetDataList.forEach(this::add);
	}

	// ==================================================行==================================================

	/**
	 * 获取指定工作表所有的行索引。默认按自然数顺序排序
	 * 
	 * @param sheetIndex 工作表索引
	 * @return 行索引集合
	 */
	public List<Integer> getRowIndexList() {
		return sheetDataList.stream().map(SheetData::getRowIndex).distinct().sorted(Integer::compare)
				.collect(Collectors.toList());
	}

	// ==================================================数据==================================================

	/**
	 * 获取指定行、列的数据
	 * 
	 * @param rowIndex 行索引
	 * @param colIndex 列索引
	 * @return 数据
	 */
	@Nullable
	public SheetData getSheetData(int rowIndex, int colIndex) {
		Stream<SheetData> stream = sheetDataList.stream();
		if (rowIndex != -1) {
			stream = stream.filter(x -> x.getRowIndex() == rowIndex);
		}
		if (colIndex != -1) {
			stream = stream.filter(x -> x.getColIndex() == colIndex);
		}
		return stream.findFirst().orElse(null);
	}

	/**
	 * @return 第一个数据
	 */
	@Nullable
	public SheetData getFirstSheetData() {
		return ListUtil.getFirst(sheetDataList);
	}

	/**
	 * @return 是否只有一个值
	 */
	public boolean isOneSheetData() {
		return sheetDataList.size() == 1;
	}

	// ==================================================工作表索引==================================================

	/**
	 * @return 工作表索引
	 */
	public int getSheetIndex() {
		return sheetIndex;
	}

	// ==================================================数据集==================================================

	/**
	 * @return 数据集的集合。这个集合是不可变的。
	 */
	public List<SheetData> getSheetDataList() {
		return Collections.unmodifiableList(sheetDataList);
	}

	// ==================================================转字符串==================================================

	@Override
	public String toString() {
		return "SheetDatas [sheetIndex=" + sheetIndex + ", sheetDataList=" + sheetDataList + "]";
	}

}
